import os
from config import settings 
from fastapi import FastAPI, HTTPException
from fastapi.exceptions import RequestValidationError
from fastapi.middleware.cors import CORSMiddleware
from starlette.middleware.sessions import SessionMiddleware
from fastapi.staticfiles import StaticFiles

from core import Exception, Events, Middleware,Router
from fastapi.templating import Jinja2Templates
# from tortoise.exceptions import OperationalError, DoesNotExist, IntegrityError, ValidationError
# from fastapi.openapi.docs import (get_redoc_html, get_swagger_ui_html, get_swagger_ui_oauth2_redirect_html)
# from fastapi.openapi.utils import get_openapi

application = FastAPI(
    debug = settings.APP_DEBUG,
    description=settings.DESCRIPTION,
    vesion=settings.VERSION,
    title=settings.PROJECT_NAME
)
# 事件监听
application.add_event_handler("startup", Events.startup(application))
application.add_event_handler("shutdown", Events.stopping(application))

# 异常错误处理
application.add_exception_handler(HTTPException, Exception.http_error_handler)
application.add_exception_handler(RequestValidationError, Exception.http422_error_handler)
application.add_exception_handler(Exception.UnicornException, Exception.unicorn_exception_handler)
# application.add_exception_handler(DoesNotExist, Exception.mysql_does_not_exist)
# application.add_exception_handler(IntegrityError, Exception.mysql_integrity_error)
# application.add_exception_handler(ValidationError, Exception.mysql_validation_error)
# application.add_exception_handler(OperationalError, Exception.mysql_operational_error)
# 路由
application.include_router(Router.router)
# 中间件
application.add_middleware(Middleware.BaseMiddleware)

application.add_middleware(
    CORSMiddleware,
    allow_origins=settings.CORS_ORIGINS,
    allow_credentials=settings.CORS_ALLOW_CREDENTIALS,
    allow_methods=settings.CORS_ALLOW_METHODS,
    allow_headers=settings.CORS_ALLOW_HEADERS,
)

application.add_middleware(
    SessionMiddleware,
    secret_key=settings.SECRET_KEY,
    session_cookie=settings.SESSION_COOKIE,
    max_age=settings.SESSION_MAX_AGE
)
# 静态资源目录
application.mount('/static',StaticFiles(directory=os.path.join(os.getcwd(),"static")))
application.state.views = Jinja2Templates(directory = settings.TEMPLATE_DIR)

app = application
if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)